جزوه · فصل دهم · جلسه ۹۹ · رمزنگاری فایل در لینوکس با GPG ← بازگشت به فهرست
📘 فصل دهم · جلسه ۹۹ رمزنگاری فایل در لینوکس با GPG
📅 تاریخ: شنبه، ۷ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
این جلسه یکی از مباحث کلیدی در امنیت داده‌ها است. رمزنگاری فایل‌ها با gpg در آزمون‌های LPIC و RHCSA بسیار پرتکرار است.
🔒 قبل از شروع، یه مثال ساده:

فرض کن می‌خوای یه نامهٔ محرمانه برای دوستت بفرستی، اما نمی‌خوای هیچ کس دیگه‌ای بتونه بخونش. نامه رو توی یه صندوق قفل‌شده می‌ذاری و فقط اون شخص کلید داره. توی لینوکس، GPG دقیقاً همینه: یه ابزار قدرتمند برای رمزنگاری فایل‌ها و امضای دیجیتال که بهت اجازه میده داده‌هات رو از دید دیگران مخفی کنی. این جلسه بهت یاد میده چطور با gpg کار کنی!

▍ GPG چیست؟

GPG (مخفف GNU Privacy Guard) یک پیاده‌سازی آزاد و متن‌باز از استاندارد OpenPGP است. از آن برای:

🔑 نکته کلیدی: GPG از رمزنگاری نامتقارن (Public/Private Key) استفاده می‌کند. شما یک کلید عمومی برای رمزنگاری و یک کلید خصوصی برای رمزگشایی دارید.

▍ ساختار دایرکتوری GPG

کلیدهای GPG در دایرکتوری ~/.gnupg/ ذخیره می‌شوند. ساختار آن:

┌──(ya3in㉿kali)-[~] └─$ ls ~/.gnupg/ common.conf openpgp-revocs.d private-keys-v1.d public-keys.d trustdb.gpg

توضیح:

▍ مرحله ۱: تولید کلید GPG

برای شروع باید یک جفت‌کلید (عمومی و خصوصی) تولید کنید.

┌──(ya3in㉿kali)-[~] └─$ gpg --full-generate-key gpg (GnuPG) 2.2.40; Copyright (C) 2022 g10 Code GmbH Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) (14) Existing key from card Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (3072) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire 1 = key expires in n days 5 = key expires in n weeks 6 = key expires in n months 7 = key expires in n years Key is valid for? (0) 0 Real name: Ya3in User Email address: ya3in@example.com Comment: My GPG Key Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O Enter passphrase: (یک رمز قوی وارد کنید) Repeat passphrase: (دوباره وارد کنید)
نکته: gpg --full-generate-key یک کلید کامل با تنظیمات دقیق تولید می‌کند. اندازهٔ کلید ۴۰۹۶ بیت امن‌ترین گزینه است.

• مشاهدهٔ کلیدهای ساخته‌شده

┌──(ya3in㉿kali)-[~] └─$ gpg --list-keys /home/ya3in/.gnupg/pubring.kbx -------------------------------- pub rsa4096 2026-09-07 [SC] ABCDEF1234567890ABCDEF1234567890ABCDEF uid [ultimate] Ya3in User (My GPG Key) <ya3in@example.com> sub rsa4096 2026-09-07 [E]

▍ مرحله ۲: صادرات کلید عمومی

برای اینکه دیگران بتوانند برای شما پیام رمزنگاری‌شده بفرستند، باید کلید عمومی خود را در اختیار آنها بگذارید.

• صادرات به صورت باینری

┌──(ya3in㉿kali)-[~] └─$ gpg --export ya3in@example.com > public.key

• صادرات به صورت متنی (ASCII Armor)

┌──(ya3in㉿kali)-[~] └─$ gpg --armor --export ya3in@example.com > public.key └─$ cat public.key -----BEGIN PGP PUBLIC KEY BLOCK----- mQINBGW... ... (رشته طولانی) -----END PGP PUBLIC KEY BLOCK-----

توضیح: گزینهٔ --armor کلید را به صورت متن قابل خواندن (ASCII) صادر می‌کند که برای ایمیل و اشتراک‌گذاری در وب مناسب‌تر است.

نکته: کلید عمومی را می‌توانید با خیال راحت به اشتراک بگذارید. کلید خصوصی هرگز نباید در اختیار کسی قرار گیرد.

▍ مرحله ۳: واردات کلید عمومی دیگران

برای اینکه بتوانید برای کسی فایل رمزنگاری‌شده بفرستید، باید کلید عمومی او را وارد کنید.

┌──(ya3in㉿kali)-[~] └─$ gpg --import public.key gpg: key ABCDEF1234567890: public key "UserB (Test Key) <userb@example.com>" imported gpg: Total number processed: 1 gpg: imported: 1 └─$ gpg --list-keys /home/ya3in/.gnupg/pubring.kbx -------------------------------- pub rsa4096 2026-09-07 [SC] ABCDEF1234567890ABCDEF1234567890ABCDEF uid [ unknown] UserB (Test Key) <userb@example.com> sub rsa4096 2026-09-07 [E]
💡 نکته: بعد از واردات، کلید به عنوان [ unknown ] نشان داده می‌شود. برای تأیید هویت، می‌توانید آن را امضا کنید (Sign).

▍ مرحله ۴: رمزنگاری فایل با کلید عمومی

حالا می‌توانید یک فایل را با کلید عمومی گیرنده رمزنگاری کنید.

┌──(ya3in㉿kali)-[~] └─$ echo "LPIC1 GPG Public Key Test" > secret.txt └─$ gpg -e -r userb@example.com secret.txt gpg: checking the trustdb gpg: using "userb@example.com" as default secret key gpg: This key belongs to us gpg: There is no assurance this key really belongs to the named user gpg: It is NOT certain that the key belongs to its owner. If you *really* know what you are doing, you may answer the next question with yes. Use this key anyway? (y/N) y gpg: secret.txt encrypted └─$ ls secret.txt secret.txt.gpg

توضیح:

نکته: فقط گیرنده (صاحب کلید خصوصی) می‌تواند فایل را رمزگشایی کند.

▍ مرحله ۵: انتقال فایل رمزنگاری‌شده

فایل رمزنگاری‌شده را می‌توانید از طریق هر روشی (ایمیل، scp، USB، ...) به گیرنده منتقل کنید.

┌──(ya3in㉿kali)-[~] └─$ scp secret.txt.gpg userb@192.168.1.100:/home/userb/

▍ مرحله ۶: رمزگشایی فایل (در سمت گیرنده)

گیرنده با کلید خصوصی خود و Passphrase می‌تواند فایل را رمزگشایی کند.

┌──(userb㉿server)-[~] └─$ gpg -d secret.txt.gpg gpg: encrypted with RSA key, ID ABCDEF1234567890 gpg: public key is ABCDEF1234567890 gpg: using "userb@example.com" as default secret key Enter passphrase: (رمز کلید خصوصی را وارد کنید) gpg: encrypted with 4096-bit RSA key, ID ABCDEF1234567890 LPIC1 GPG Public Key Test

توضیح: -d یعنی Decrypt (رمزگشایی). محتوای فایل اصلی نمایش داده می‌شود.

• ذخیرهٔ خروجی رمزگشایی‌شده در فایل

┌──(userb㉿server)-[~] └─$ gpg -d secret.txt.gpg > secret.txt └─$ cat secret.txt LPIC1 GPG Public Key Test

▍ نصب pinentry برای وارد کردن Passphrase

pinentry یک برنامهٔ کمکی است که یک پنجرهٔ گرافیکی یا متنی برای وارد کردن Passphrase نمایش می‌دهد.

┌──(ya3in㉿kali)-[~] └─$ sudo dnf install pinentry # در Red Hat / Fedora └─$ sudo apt install pinentry-curses # در Debian / Ubuntu
نکته: اگر هنگام رمزگشایی خطای مربوط به pinentry دیدید، آن را نصب کنید تا Passphrase را به راحتی وارد کنید.

▍ جدول خلاصه دستورات GPG

دستور کاربرد
gpg --full-generate-key تولید جفت‌کلید جدید
gpg --list-keys نمایش کلیدهای عمومی موجود
gpg --list-secret-keys نمایش کلیدهای خصوصی موجود
gpg --export user@example.com > public.key صادرات کلید عمومی (باینری)
gpg --armor --export user@example.com > public.key صادرات کلید عمومی (متنی)
gpg --import public.key واردات کلید عمومی دیگران
gpg -e -r user@example.com file.txt رمزنگاری فایل برای گیرنده
gpg -d file.txt.gpg رمزگشایی فایل
gpg -d file.txt.gpg > file.txt رمزگشایی و ذخیره در فایل
gpg --delete-key user@example.com حذف کلید عمومی
gpg --delete-secret-key user@example.com حذف کلید خصوصی

▍ سناریوی کامل (بر اساس تصویر)

📝 سناریوی عملی از تصویر:

فرض کنید دو هاست A و B داریم. کاربر A می‌خواهد یک فایل را برای کاربر B رمزنگاری کند و بفرستد.

# ====== هاست B (گیرنده) ====== # ۱. تولید کلید gpg --full-generate-key # ۲. صادرات کلید عمومی gpg --armor --export userb@example.com > public.key # ۳. ارسال public.key به هاست A scp public.key usera@192.168.1.50:/home/usera/ # ====== هاست A (فرستنده) ====== # ۴. واردات کلید عمومی B gpg --import public.key # ۵. ساخت فایل و رمزنگاری echo "LPIC1 GPG Public Key Test" > secret.txt gpg -e -r userb@example.com secret.txt # ۶. ارسال فایل رمزنگاری‌شده به B scp secret.txt.gpg userb@192.168.1.100:/home/userb/ # ====== هاست B (گیرنده) ====== # ۷. رمزگشایی فایل gpg -d secret.txt.gpg # خروجی: LPIC1 GPG Public Key Test
⚠️ نکات مهم:
  • هرگز کلید خصوصی خود را با کسی به اشتراک نگذارید.
  • برای کلید خصوصی حتماً Passphrase قوی انتخاب کنید.
  • کلید عمومی را می‌توانید با خیال راحت منتشر کنید.
  • برای تأیید هویت گیرنده، کلید عمومی او را از منبع معتبر دریافت کنید.
✅ جمع‌بندی نهایی:
  • GPG → ابزار رمزنگاری فایل‌ها و امضای دیجیتال.
  • gpg --full-generate-key → تولید جفت‌کلید.
  • gpg --export → صادرات کلید عمومی.
  • gpg --import → واردات کلید عمومی دیگران.
  • gpg -e -r → رمزنگاری فایل برای گیرنده خاص.
  • gpg -d → رمزگشایی فایل.
  • --armor → تبدیل کلید به فرمت متنی (ASCII).
📝 تمرین پیشنهادی:

یک سناریوی کامل پیاده‌سازی کنید:

  • یک جفت‌کلید GPG با gpg --full-generate-key بسازید.
  • کلید عمومی خود را با --armor --export صادر کنید.
  • یک فایل متنی ساده بسازید و با gpg -e -r برای خودتان (یا یک دوست) رمزنگاری کنید.
  • فایل را با gpg -d رمزگشایی کنید.
  • کلید عمومی یک دوست را وارد کنید و برای او فایل رمزنگاری‌شده بفرستید.